package datasource;

import java.util.HashMap;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;

import play.Play;
/**
 * 单例模式拿session
 *
 *
 * @version 1.0
 * @since JDK1.7
 * @author yutao
 * @company 上海朝阳永续信息技术有限公司
 * @copyright (c) 2016 SunTime Co'Ltd Inc.All rights reserved.
 * @date 2017年4月26日下午4:34:21
 */
public enum ConnectionSSH2 {

	dataSource;
	
	private Session session = null;
	
	private Map<String, Session> sessionMap = new HashMap<String, Session>();
	
	private Logger logger = LogManager.getLogger(ConnectionSSH2.class);
	
	private String pubKeyPath;
	private String username;
	private String host;
	private int port;
	
	
	/**
	 * 通过外接传主机、端口、远程服务器的用户名来选择连接的服务器
	 * @param pubKeyPath
	 * @author yutao
	 * @date 2017年5月3日下午8:01:12
	 */
	private void addPubKeyPath(String host, int port, String username){
		logger.debug("----传入参数---免密登录---username-----" + username);
		logger.debug("----传入参数---免密登录---host-----" + host);
		logger.debug("----传入参数---免密登录---portStr-----" + port);
		Session sessionInstant = sessionMap.get(host);
		if(sessionInstant==null || !sessionInstant.isConnected()){
			JSch jsch = new JSch();
			try {
				logger.debug("----传入参数---免密登录---pubKeyPath-----" + pubKeyPath);
				jsch.addIdentity(pubKeyPath);
				Session sion = jsch.getSession(username, host, port);//为了连接做准备
				sion.setConfig("StrictHostKeyChecking", "no");
				sion.setTimeout(300);
				sion.connect();
				sessionMap.put(host, sion);
			} catch (JSchException e) {
				logger.error("----建立连接获取session异常----" + e.getStackTrace());
			}
		}
	}
	
	
	
	/**
	 * 默认连接的是110服务器
	 * 
	 * @author yutao
	 * @date 2017年5月3日下午8:01:44
	 */
	private void addPubKeyPath(){
		JSch jsch = new JSch();
		try {
			jsch.addIdentity(pubKeyPath);
			this.session = jsch.getSession(username, host, port);//为了连接做准备
	        this.session.setConfig("StrictHostKeyChecking", "no");
			this.session.setTimeout(300);
			this.session.connect();
		} catch (JSchException e) {
			logger.error("----addPubKeyPath---无参数--建立连接获取session异常----" + e.getStackTrace());
		}
	}
	
	
	private ConnectionSSH2(){//构造初始化
		String username = Play.configuration.getProperty("jsch.username.test");
		String host = Play.configuration.getProperty("jsch.host.test");
		String portStr = Play.configuration.getProperty("jsch.port.test");
		String pubKeyPath = Play.configuration.getProperty("jsch.pubKeyPath");
		
		if(portStr != null){
			int port = Integer.valueOf(portStr);
			this.port = port;
		}
		this.pubKeyPath = pubKeyPath;
		this.host = host;
		this.username = username;
	}
	
	/**
	 * 获得session（jsch.host.test）
	 * @param pubKeyPath
	 * @param host
	 * @param port
	 * @param username
	 * @return
	 * @author yutao
	 * @date 2017年4月26日下午3:26:26
	 */
	public Session getSession(){
		addPubKeyPath();
		return this.session;
	}
	
	/**
	 * 根据主机、端口和用户名获得session
	 * @param host
	 * @param port
	 * @param username
	 * @return
	 * @author yutao
	 * @date 2017年4月26日下午3:26:26
	 */
	public Session getSession(String host, int port, String username){
		addPubKeyPath(host, port, username);
		logger.debug("-----得到session----");
		return sessionMap.get(host);
	}
}
